package collection;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.Random;

/**
 *  终端操作:
 *  min:获取流中的最小值
 *  max:获取流中的最大值
 *  anyMatch:进行流中的元素任意匹配，只要有一个元素匹配成功则返回true
 *  allMatch:进行流中元素的全部匹配，只有都匹配才参会true
 *  noneMatch:当流中没有元素匹配则返回true
 *  reduce:积累操作，将流中所有元素最终积累成一个值
 */
public class StreamAPIDemo2 {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        Random random = new Random();
        for(int i=0;i<3;i++){
            list.add(random.nextInt(100));
        }
        System.out.println(list);
        /*
            找到集合中的最小值
            min方法返回一个Optional对象，表示集合中的最小值
            Optional有点像包装类，是将一个值包装为一个对象
         */
//        Optional<Integer> o = list.stream().min((e1, e2)->e1-e2);
        //最大值
        Optional<Integer> o = list.stream().max((e1, e2)->e1-e2);
        int num = o.get();
        System.out.println(num);

        //查看集合中是否有偶数
        boolean anyMatch = list.stream().anyMatch(e->e%2==0);
        System.out.println("是否含有偶数:"+anyMatch);

        //查看集合中是否所有元素都>50
        boolean allMatch = list.stream().allMatch(e->e>50);
        System.out.println("所有元素都>50:"+allMatch);

        //集合中所有元素是否都为奇数
        boolean noneMatch = list.stream().noneMatch(e->e%2==0);//没有任何元素匹配偶数
        System.out.println("都是奇数:"+noneMatch);

        /*
            reduce积累操作:先将集合前两个元素进行操作，将结果再与第三个元素进行操作，再将
            结果与第四个元素进行操作以此类推

            对集合求和
            list:[1,2,3,4,5,6,7,8,9]
            reduce((e1,e2)->e1+e2)

            第一次reduce:1和2操作:1+2
            list:[3,3,4,5,6,7,8,9]

            第二次reduce:3和3操作:3+3
            list:[6,4,5,6,7,8,9]

            第三次
            list:[10,5,6,7,8,9]
         */
//        o = list.stream().reduce((e1,e2)->e1+e2);
//        o = list.stream().reduce((e1,e2)->Integer.sum(e1,e2));
        o = list.stream().reduce(Integer::sum);
        num = o.get();
        System.out.println(num);

    }
}
